<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script type="text/javascript">
      function fun(a, b) {
        // alert(this.name);
        console.log('a = ' + a);
        console.log('b = ' + b);
      }

      /*
        call()和apply()
          - 这两个方法都是函数对象的方法,需要通过函数对象来调用
          - 当对函数调用call()和apply()都会调用函数执行
          - 在调用call()和apply()可以将一个对象指定为第一个参数
                此时这个对象将会成为函数执行时的this
                call()和apply()可以修改函数执行时的this
          - call()方法可以将方法的实参,在对象之后依次传递
          - apply()方法需要将方法的实参,封装到一个数组中统一传递

          - this的情况:
              1.以函数形式调用时,this永远都是是window
              2.以方法的形式调用时,this是方法的对象
              3.以构造函数的形式调用时,this是新创建的对象
              4.使用call和apply调用时,this是指定的对象
      */

      var obj = {
        name: 'obj',
        sayName: function () {
          alert(this.name);
        },
      };
      fun.call(obj, 2, 3);
      fun.apply(obj, [2, 3]);

      var obj2 = {
        name: 'obj2',
        sayName: function () {
          alert(this.name);
        },
      };
      //三种调用函数的方式
      // fun.call();
      // fun.apply();
      // fun();
      fun.call(obj);
      fun.apply(obj2);

      obj.sayName.apply(obj2);
    </script>
  </head>
  <body></body>
</html>
